package cn.szsys.integration.billrule.strtegy;

import lombok.Data;
import lombok.extern.slf4j.Slf4j;

import java.util.List;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;

/**
 * 延迟保存记录
 *
 * @author rhf
 * @date 2022-12-13
 **/
@Slf4j
@Data
public abstract class AbstractDelaySaveRecord<P> {

    /**
     * 单个批次任务数量
     **/
    public int taskBatchSize = 100;

    /**
     * 最大任务数
     **/
    public int maxQueueCapacity = 100000;

    /**
     * 消息队列
     */
    private BlockingQueue<P> messageBlockingQueue = new LinkedBlockingQueue<>(getMaxQueueCapacity());

    /**
     * 执行方法
     * @author rhf
     * @param p 范型参数
     */
    public void addRecord(P p){
        boolean offer = messageBlockingQueue.offer(p);
        if (!offer) {
            log.error("添加任务失败: -> {}, 已暂用队列长度:[{}]", p, messageBlockingQueue.size());
        }
    }

    /**
     * 执行任务方法
     * @author rhf
     * @param params 参数
     */
    protected abstract void scheduleTask(List<P> params);

    /**
     * 返回队列数内的数量
     * @author rhf
     * @return int
     */
    public int getSize(){
        return messageBlockingQueue.size();
    }

    /**
     * 获取任务
     * @author rhf
     * @return P
     */
    public P getTask(){
        return messageBlockingQueue.poll();
    }
}
